﻿using Bentley.DgnPlatform;
using Bentley.Interop.MicroStationDGN;
using Bentley.MstnPlatformNET;
using Bentley.UI.Controls.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BIM = Bentley.Interop.MicroStationDGN;

namespace LevelChangeTool
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Bentley.DgnPlatformNET.DgnFile currentDesingeFile;
        private List<DgnListItem> _currentDgnFileList = new List<DgnListItem>();
        private void Form1_Load(object sender, EventArgs e)
        {
            InitList();
            // fileList.Items.Add

        }

        private void InitList()
        {
            _currentDgnFileList.Clear();
            fileList.Items.Clear();
            labMessage.Text = string.Empty;
            currentDesingeFile = Session.Instance.GetActiveDgnFile();
            DgnListItem dgnListItem = new DgnListItem { FileFullName = currentDesingeFile.GetFileName() };
            fileList.Items.Add(dgnListItem);
            _currentDgnFileList.Add(dgnListItem);
        }

        //移动模型文件到指定层

        private void 移动ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            #region 说明
            /*
             * 1.获取列表中当前选中的文件
             * 3.获取层名，如果层名是空白，则表示不修改层
             * 3.获取当前文件中是否有选中的模型
             *   如果没有：
             *       层名为空白：
             *           不进行任何操作
             *       层名不为空白：
             *           检查文件是不是当前文件
             *               是：
             *                   不进行任何操作
             *               否：
             *                   打开选中的文件
             *           检查打开的文件中是否存在层
             *               存在：
             *                   不进行任何操作
             *               不存在：
             *                   添加新层
             *            移动文件中所有模型到这个层中
             *    如果有：
             *           收集模型数据，将这些模型移动到选定层中，删除现有模型中的文件
             *                
             *  
             */
            #endregion
            BIM.Application app = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp;//
            DgnListItem delDgn;//被选中的文件
            #region 有选中的文件
            if (fileList.SelectedIndex > -1)
            {
                delDgn = (DgnListItem)fileList.SelectedItem;

                //判断是不是有选中的模型
               // var selectElement = app.ActiveModelReference.GetSelectedElements().BuildArrayFromContents();
                if (!app.ActiveModelReference.AnyElementsSelected)
                {
                    //没有选中的模型
                    MoveElementWithoutSelectElement(delDgn);

                }
                else
                {
                    //有选中的模型
                    MoveElementWithSelectElement();
                }

            }
            #endregion
            #region 没有选中的文件
            else
            {
                labMessage.Text = "必须选中一个文件";
            }
            #endregion


        }



        //添加文件到列表
        private void 添加ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                var newFiles = ofd.FileNames;
                foreach (string newFileFullName in newFiles)
                {
                    if (!_currentDgnFileList.Any(d => d.FileFullName == newFileFullName))
                    {
                        DgnListItem dgnListItem = new DgnListItem { FileFullName = newFileFullName };
                        _currentDgnFileList.Add(dgnListItem);
                        fileList.Items.Add(dgnListItem);

                    }

                }
                labMessage.Text = "添加完成";
            }
        }
        //移除当前文件
        private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (fileList.SelectedIndex > -1)
            {
                DgnListItem delDgn = (DgnListItem)fileList.SelectedItem;
                fileList.Items.Remove(delDgn);
                _currentDgnFileList.Remove(delDgn);
                labMessage.Text = $"文件 [{delDgn.FileName}] 移除成功";

            }

        }
        //刷新，检测这些文件还存不存在
        private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _currentDgnFileList.ForEach(
                d =>
                {
                    if (!File.Exists(d.FileFullName))
                    {
                        _currentDgnFileList.Remove(d);
                    }

                }

                );
            fileList.Items.Clear();
            _currentDgnFileList.ForEach(
               d =>
               {

                   fileList.Items.Add(d);
               }

               );
            labMessage.Text = "刷新成功";
        }
        //移除所有添加的文件
        private void 移除全部ToolStripMenuItem_Click(object sender, EventArgs e)
        {

            InitList();
            labMessage.Text = "移除成功";
        }

        private void MoveElementWithoutSelectElement(DgnListItem delDgn)
        {
            //判断层名是否为空
            if (string.IsNullOrWhiteSpace(textBoxLevleName.Text))
            {
                labMessage.Text = "请设置层名";
            }
            //层名不为空的话，提示将把整个文件中的模型都移动
            else
            {

                if (MessageBox.Show($"将会把文件[{delDgn.FileName}]中所有模型移动到层[{textBoxLevleName.Text}]", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
                {
                    string orgFileFullName = Session.Instance.GetActiveDgnFile().GetFileName();
                    
                    if (orgFileFullName != delDgn.FileFullName)
                    {
                        Session.Instance.NewDesignFile(delDgn.FileFullName);
                    }
                    
                
                }
            }


        }
        private void MoveElementWithSelectElement()
        {

        }

        private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (fileList.SelectedIndex > -1)
            {
                DgnListItem delDgn = (DgnListItem)fileList.SelectedItem;
                Session.Instance.NewDesignFile(delDgn.FileFullName);


                labMessage.Text = $"文件 [{delDgn.FileName}] 已打开";


            }
        }

        private void GetLevel()
        {
            string name = textBoxLevleName.Text;
            BIM.Application app = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp;
            var levels = app.ActiveModelReference.Levels;
             Level level=null;//层
            if (levels[name]==null)
            {
                //层不存在
                level = app.ActiveDesignFile.AddNewLevel(name);


            }
            else
            {
                //层存在
                 level = levels[name];
            }
            ElementScanCriteria esc = scan
           // ElementEnumerator ele=app.

        }
    }
}

